package qualomelhor.gwt.modules.client;

import java.util.ArrayList;

import qualomelhor.database.Categoria;
import qualomelhor.database.ParametrosSistema;
import qualomelhor.database.ParteAvatar;
import qualomelhor.database.Produto;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;

public class EditarParteAvatar implements EntryPoint {
	private Label lbId;
	private TextBox txtNomeArquivo;
	private ListBox cbTipoParteCorpo;
	private ArrayList<ParteAvatar> listParteAvatar;
	private int posReg = 0;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private Label lbNumRegistro;

	@Override
	public void onModuleLoad() {
		carregaListParteAvatar();
	}

	public void carregaListParteAvatar() {
		carregaParteAvatar(true);
	}

	private void carregaFormEditarParteAvatar() {
		System.out.println("listParteAvatar.size = " + listParteAvatar.size());
		RootPanel rootPanel = RootPanel.get("divCadastro");
		rootPanel.clear();
		//rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);

		VerticalPanel verticalPanel = new VerticalPanel();
		rootPanel.add(verticalPanel, 22, 10);
		verticalPanel.setSize("278px", "280px");

		HorizontalPanel horizontalPanelNav = new HorizontalPanel();
		verticalPanel.add(horizontalPanelNav);

		Button btnNovo = new Button("Novo");
		btnNovo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				novo();
			}
		});
		horizontalPanelNav.add(btnNovo);

		Button btnAnterior = new Button("Anterior");
		btnAnterior.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg >= 0) {
					posReg--;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnAnterior);

		Button btnProximo = new Button("Proximo");
		btnProximo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg < listParteAvatar.size()) {
					posReg++;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnProximo);

		Button btnDeletar = new Button("Deletar");
		btnDeletar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				deletaParteAvatar(listParteAvatar.get(posReg).getId());
			}
		});
		horizontalPanelNav.add(btnDeletar);

		lbNumRegistro = new Label("");
		horizontalPanelNav.add(lbNumRegistro);

		FlexTable tbCadastro = new FlexTable();
		verticalPanel.add(tbCadastro);

		Label lblNewLabel = new Label("Id:");
		tbCadastro.setWidget(0, 0, lblNewLabel);

		lbId = new Label("");
		tbCadastro.setWidget(0, 1, lbId);

		Label lblNewLabel_1 = new Label("Nome Arquivo:");
		tbCadastro.setWidget(1, 0, lblNewLabel_1); 
		lblNewLabel_1.setSize("138", "16");

		txtNomeArquivo = new TextBox();
		tbCadastro.setWidget(1, 1, txtNomeArquivo);

		Label lblNewLabel_2 = new Label("Tipo Parte Avatar:");
		tbCadastro.setWidget(2, 0, lblNewLabel_2);
		lblNewLabel_2.setSize("138", "16");

		cbTipoParteCorpo = new ListBox();
		cbTipoParteCorpo.addItem("Cabelo", String.valueOf(ParteAvatar.TIPO_PARTE_CORPO_CABELO));
		cbTipoParteCorpo.addItem("Olho", String.valueOf(ParteAvatar.TIPO_PARTE_CORPO_OLHO));
		cbTipoParteCorpo.addItem("Boca", String.valueOf(ParteAvatar.TIPO_PARTE_CORPO_BOCA));
		cbTipoParteCorpo.addItem("Roupa", String.valueOf(ParteAvatar.TIPO_PARTE_CORPO_ROUPA));

		tbCadastro.setWidget(2, 1, cbTipoParteCorpo);
		cbTipoParteCorpo.setWidth("152px");

		HorizontalPanel horizontalPanel_8 = new HorizontalPanel();
		verticalPanel.add(horizontalPanel_8);
		verticalPanel.setCellHorizontalAlignment(horizontalPanel_8, HasHorizontalAlignment.ALIGN_CENTER);

		Button btnSalvar = new Button("Salvar");
		btnSalvar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				Long id = lbId.getText().equals("")?null:Long.valueOf(lbId.getText());
				int tipoParteCorpo = Integer.parseInt(cbTipoParteCorpo.getValue(cbTipoParteCorpo.getSelectedIndex()));

				salvaParteAvatar(id, txtNomeArquivo.getText(), tipoParteCorpo);
			}
		});
		horizontalPanel_8.add(btnSalvar);
		horizontalPanel_8.setCellHorizontalAlignment(btnSalvar, HasHorizontalAlignment.ALIGN_CENTER);
	}

	private void novo() {
		lbNumRegistro.setText("Novo Registro");
		lbId.setText("");
		txtNomeArquivo.setText("");
		cbTipoParteCorpo.setSelectedIndex(-1);
	}

	private void atualiza() {
		if (posReg == -1 || posReg == listParteAvatar.size()) {
			novo();
		} else {
			lbNumRegistro.setText("Registro " + (posReg + 1) + " de " + listParteAvatar.size());
			lbId.setText(listParteAvatar.get(posReg).getId().toString());
			for (int i = 0; i < cbTipoParteCorpo.getItemCount(); i++) {
				if (cbTipoParteCorpo.getValue(i).equals(String.valueOf(listParteAvatar.get(posReg).getTipoParteCorpo()))) {
					cbTipoParteCorpo.setSelectedIndex(i);
					break;
				}
			}
		}
	}

	private void salvaParteAvatar(Long id, String nomeArquivo, int tipoParteCorpo) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
				carregaParteAvatar(true);
			}
		};
		System.out.println("Salvando produto: id = " + id + ", nomeArquivo = " + nomeArquivo + ", tipoParteCorpo = " + tipoParteCorpo);
		serviceSupportSvc.gravaParteAvatar(id, nomeArquivo, tipoParteCorpo, callback);
	}

	private void deletaParteAvatar(Long id) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
				carregaParteAvatar(true);
			}
		};
		System.out.println("Deletando parte avatar..");
		serviceSupportSvc.deletaParteAvatar(id, callback);
	}

	void carregaParteAvatar (boolean recarregar) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<ParteAvatar>> callback = new AsyncCallback<ArrayList<ParteAvatar>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<ParteAvatar> result) {
				listParteAvatar = result;
				carregaFormEditarParteAvatar();
			}
		}; 

		serviceSupportSvc.getListParteAvatar(recarregar, callback);
	}
}